package com.xiaomitest;

import java.util.Scanner;

// 并查集
// 常用于解决:某个元素是否属于某个集合,或者 某个元素 和 另一个元素是否同属于一个集合
public class UnionCollect {

    // 记录每个结点对应的父节点
    private int[] parent;

    // 记录每个结点对应的重量
    private int[] weight;

    // 并查集元素个数
    private int size;

    // 并查集集合的个数（组数）
    private int groups;

    public UnionCollect(int size){
        this.size = size;
        this.groups = size;
        this.parent = new int[size];
        this.weight = new int[size];

        for (int i = 0; i < size; i++) {
            this.parent[i] = i;
            this.weight[i] = 1;
        }
    }

    // 寻找自身的上级的函数
    public int find(int element){
        while (element != parent[element]){
            // 当前元素的上级指向上级的上级
            // 1 <-- 3 <-- 4
            // 变为1 <-- 4
            parent[element] = parent[parent[element]];
            // 上级的上级的元素
            // 此时的element 就是 1 不是4
            // 1 <-- 3 和 1 <-- 4
            element = parent[element];
        }
        return element;
    }

    // 是否在集合中就看它们的最终上级是否相同
    public boolean isConnected(int firstElement,int secondElement){
        return find(firstElement) == find(secondElement);
    }

    // 合并
    public void unionElements(int firstElement,int secondElement){
        int firstRoot = find(firstElement);
        int secondRoot = find(secondElement);
        if(firstRoot == secondRoot || isConnected(firstElement,secondElement)){
            return;
        }
        if(weight[firstRoot] < weight[secondRoot]){
            parent[firstRoot] = secondRoot;
            weight[secondRoot] += weight[firstRoot];
        }else{
            parent[secondRoot] = firstRoot;
            weight[firstRoot] += weight[secondRoot];
        }
        this.groups--;

    }

    public int getGroups(){
        return this.groups;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 每个集合的大小
        int size = scanner.nextInt();
        while (size != 0){
            int input = scanner.nextInt();
            UnionCollect uc = new UnionCollect(size);
            for (int i = 0; i < input; i++) {
                int first = scanner.nextInt() - 1;
                int second = scanner.nextInt() - 1;
                uc.unionElements(first,second);
            }
            // 最后剩下的组数 - 1 就是最后的答案。因为连接M组的话，需要M-1条连线就可以了
            System.out.println(uc.getGroups() - 1);
            size = scanner.nextInt();
        }
    }


}
